x86: fix msi_free_irq().
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 27 Aug 2009 09:13:13 +0000 (10:13 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 27 Aug 2009 09:13:13 +0000 (10:13 +0100)
1) We should invoke destroy_irq() before msix_put_fixmap().
2) destroy_irq() invokes mask_msi_irq() eventually, so we can remove
the duplicate mask operation in the 'if' statement here.

Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
xen/arch/x86/msi.c

index 5125ba1cbe672e1575abe32dd0ed196192e7a67f..6dd2027c90ce714ef1726ac00a29bb2a2ffeae3f 100644 (file)
@@ -443,17 +443,14 @@ int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
 
 int msi_free_irq(struct msi_desc *entry)
 {
+    destroy_irq(entry->irq);
     if ( entry->msi_attrib.type == PCI_CAP_ID_MSIX )
     {
         unsigned long start;
-
-        writel(1, entry->mask_base + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
-
         start = (unsigned long)entry->mask_base & ~(PAGE_SIZE - 1);
         msix_put_fixmap(entry->dev, virt_to_fix(start));
     }
     list_del(&entry->list);
-    destroy_irq(entry->irq);
     xfree(entry);
     return 0;
 }